package com.woniuxy.config.redislistener;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.stereotype.Component;

/**
 * @Author: 马宇航
 * @Description: 监听redis的key的过期事件
 * @DateTime: 25/10/27/星期一 17:30
 * @Component: 成都蜗牛学苑
 **/
@Component
public class KeyExpiredListenner {
    @Resource
    private RedisMessageListenerContainer redisMessageListenerContainer;
    @Autowired
    RedisTemplate redisTemplate;
    /**
     * 初始化监听器，订阅过期事件频道
     */
    @PostConstruct
    public void init() {
        // 订阅db0的过期事件频道
        ChannelTopic topic = new ChannelTopic("__keyevent@0__:expired");

        // 创建消息监听适配器(适配器自己下来研究）
        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] pattern) {
                System.out.println(message);
                // 获取过期的键名
                String expiredKey = new String(message.getBody());
                // 执行自定义逻辑
                handleExpiredKey(expiredKey);
            }
        });
        // 将监听器添加到容器
        redisMessageListenerContainer.addMessageListener(listenerAdapter, topic);
    }

    /**
     * 处理过期键的自定义方法
     */
    private void handleExpiredKey(String key) {
        System.out.println("Redis键 [" + key + "] 已过期，执行自定义逻辑...");
        // 这里可以添加具体的业务逻辑
        // 例如：清理关联数据、发送通知、更新统计信息等
        System.out.println(redisTemplate.hasKey(key));
    }
}
